#!/usr/bin/env python
#coding=utf-8
#!/usr/bin/env python
#coding=utf-8
from sqlalchemy.orm import mapper
from sqlalchemy.orm import sessionmaker

import sqlalchemy
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey,create_engine
engine = create_engine('sqlite:///SimpleSite/development.db', echo=True)
print engine
#定义一个engine,连接数据库，注意 SQLITE 定义数据表时，可以不指定长度，但其它不可以，形式类似Column('name', String(50))


metadata = MetaData()
users_table = Table('users', metadata,
     Column('id', Integer, primary_key=True),
     Column('name', String),
     Column('fullname', String),
     Column('password', String)
)

#创建数据表
metadata.create_all(engine)

#以下是定义一个PYTHON 类做为映射
class User(object):
     def __init__(self, name, fullname, password):
         self.name = name
         self.fullname = fullname
         self.password = password

     def __repr__(self):
        return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
mapper(User, users_table) 
#建立User, users_table之间的映射


print sqlalchemy.__version__ #查看版本号

ed_user = User('ed', 'Ed Jones', 'edspassword')
print ed_user.name


#一次性创建Table, Class and Mapper


Session = sessionmaker(bind=engine)#如果之前已经定义了engine,可用此种方式
#之前没有定义
#Session = sessionmaker()
#Later, when you create your engine with create_engine(), connect it to the Session using configure():
#事后,当用create_engine() 创建了engine后,用configure()再连接它即可
#Session.configure(bind=engine)

session = Session()#实例化

#使用ADD ，增加一个对象
ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)


#目前这种状态，实例正处于挂起状态，没有SQL执行，The Session将一旦需要会立即执行SQL，使用此过程的
#称之为 flush，如果我们查询数据Ed Jones，所有挂起的信息将首次被flush，查询是向后执行的
our_user = session.query(User).filter_by(name='ed').first()
print our_user

#修改数据
ed_user.password = 'f8s7ccs'

#一次增加多行
session.add_all([
     User('wendy', 'Wendy Williams', 'foobar'),
     User('mary', 'Mary Contrary', 'xxg527'),
     User('fred', 'Fred Flinstone', 'blah')])


session.commit()


#回滚比方说有两部操作 假设第二部操作出错，回滚可以把第一部已经操作的数据还原。保证数据库的正确性，减少冗余 

ed_user.name = 'Edwardo'#先修改其中一个的数据

fake_user = User('fakeuser', 'Invalid', '12345')#增加一个有错误的数据
session.add(fake_user)

session.rollback()#回滚
res=session.query(User).filter(User.name.in_(['ed', 'fakeuser'])).all()
print res#ed_user‘s name 已经回到原先的ED，fake_user被踢出session


#查询query 有all(), one(), and first() 三个方法query.all() (返回的是一个LIST）
#查询一个类
for instance in session.query(User).order_by(User.id): 
     print instance.name, instance.fullname
#查询具体的字段
for name, fullname in session.query(User.name, User.fullname): 
#可以使用PYTHON 的切片功能
for u in session.query(User).order_by(User.id)[1:3]: 
#可以使用过滤功能
for name, in session.query(User.name).filter_by(fullname='Ed Jones'): 
#可以使用过滤功能，可能边续使用
for user in session.query(User).filter(User.name=='ed').filter(User.fullname=='Ed Jones'): 
# 不等于  query.filter(User.name != 'ed')
#likie   query.filter(User.name.like('%ed%'))
#in      query.filter(User.name.in_(['ed', 'wendy', 'jack']))
#IS NULL(为空） filter(User.name == None)
#使用 AND OR from sqlalchemy import and_，or_
#filter(and_(User.name == 'ed', User.fullname == 'Ed Jones')
#使用match query.filter(User.name.match('wendy'))



#建立关系






